/* 
一个能发送ajax请求的函数
1. 统一处理请求异常
2. 异步请求成功的数据不是response, 而是response.data
3. 对post请求参数进行ulencode处理, 而不使用默认的json方式(后台接口不支持)
4. 配置请求超时的时间
5. 通过请求头携带token数据
*/

import axios from 'axios'
import qs from 'qs'
import store from '../store'
import router from '../router'
import {Toast} from 'mint-ui'

axios.defaults.timeout = 20000;

// 请求拦截器
axios.interceptors.request.use(config => {
    const {method, data} = config

    // 统一将method转化为小写的post请求，并且请求体格式为ulencode
    if(method.toLowerCase() === 'post' && data instanceof Object){
        // 转换请求体格式
        config.data = qs.stringify(data)
    }

    // 对部分页面需要token才能进行请求的做处理
   
    if(config.headers.needToken){
        const token = store.state.user.token
        // 如果没有token，不发送请求, 调到失败的回调（抛异常或返回新的promise）
        if(!token){
            const error = new Error('请登录后再查询')
            error.status = 401
            throw error
        }else{
            //如果有token，在请求头添加Authorization
            config.headers.Authorization = token
        }
    }
    return config
})

// 响应拦截器(成功的回调和失败的回调)
axios.interceptors.response.use((response) => {
    // 2. 异步请求成功的数据不是response, 而是response.data
    return response.data
},(error) => {
    // 3. 统一处理请求异常
    const {response,status, message} = error
    // debugger
    // 错误一：请求前没有携带token
    if(!response){
        // 判断当前的错误码是否为401    
        if(status === 401){
             // 判断当前页面是否为登录页面，如果不是就跳转到登录页面
            if(router.currentRoute !== '/login'){
                Toast(message)
                router.replace('/login')
            }
        }
    }
    // 错误二：请求的token超时
    if(response.status === 401){
        // 清空localstorage中原来的token
        store.dispatch('resetUser')
        // 重新跳转登录页面
        router.replace('/login')
        Toast(response.data.message)
    }
    // 错误三：其余错误
    else if(response.status === 404){
        Toast('请求资源不存在')
    }else{
        Toast('请求错误：' + message)
    }
    return new Promise(() => {})
})

export default axios